/**
 * CtrlAtividades.java
 * 
 * Projeto: SGA-LEDS
 * 
 * Rodrigo Soares Maia
 * IFES - Instituto Federal do Espírito Santo - Campus Serra
 */

package controleAtividades.cci;

import static controleInterno.cci.CtrlInterno.CONSULTAR;
import static controleInterno.cci.CtrlInterno.EDITAR;
import static controleInterno.cci.CtrlInterno.SALVAR;
import static controleInterno.cci.CtrlInterno.SALVAR_FILHA;
import controleAtividades.cdp.Atividade;
import controleAtividades.cdp.ColaboradorAtividade;
import controleAtividades.cdp.NivelAtividade;
import static controleAtividades.cdp.NivelAtividade.GERAL;
import static controleAtividades.cdp.NivelAtividade.GRUPO;
import static controleAtividades.cdp.NivelAtividade.INDIVIDUAL;
import controleAtividades.cdp.RegistroAtividade;
import controleAtividades.cgt.AplProjeto;
import controleAtividades.cgt.AplRelatorios;
import controleAtividades.cih.ArvoreAtividades;
import controleInterno.cih.BarraMenu;
import controleAtividades.cih.PagExecucao;
import controleAtividades.cih.PagFormAtividade;
import controleInterno.cih.PagPrincipal;
import controleAtividades.cih.PagRegistro;
import controleAtividades.cih.TabelaRegistro;
import controleInterno.cdp.Colaborador;
import controleInterno.cdp.Projeto;
import controleInterno.cgt.AplControleInterno;
import controleInterno.cih.PagFormCategoria;
import controleInterno.cih.PagGerenciaTipos;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zul.Div;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Window;

public class CtrlAtividades
{
    public static final int SALVAR = 0;
    public static final int SALVAR_FILHA = 1;
    public static final int EDITAR = 2;
    public static final int CONSULTAR = 3;
    private static CtrlAtividades instance = null;
    private PagPrincipal pagPrincipal;
    private BarraMenu pagBarraMenu;
    private ArvoreAtividades pagArvore = null;
    private PagExecucao pagExecucao = null;
    private PagFormAtividade pagFormAtividade;
    private PagRegistro pagRegistro;
    private TabelaRegistro tabelaRegistro = null;
    private Window arvore;
    private Window winExecucao;

    public static CtrlAtividades getInstance()
    {
        if (instance == null)
        {
            instance = new CtrlAtividades();
        }
        return instance;
    }
    
    AplProjeto aplP = AplProjeto.getInstance();
    AplRelatorios aplR = AplRelatorios.getInstance();
    
    //INTERFACE_PAGINA_PRINCIPAL
    public void setPagPrincipal(PagPrincipal pag)
    {
        this.pagPrincipal = pag;
    }
    
    //ATIVIDADE
    public Atividade salvarAtividade(List<Object> argsAtividade, List<Colaborador> alocados)
    {
        Atividade a = null;

        a = aplP.salvarAtividade(argsAtividade);

        aplP.salvarAlocados(alocados, a);

        return a;
    }

    public Atividade salvarAtividade(Map argsAtividade, List<Colaborador> alocados)
    {
        Atividade a = null;

        a = aplP.salvarAtividade(argsAtividade);

        aplP.salvarAlocados(alocados, a);

        return a;
    }

    public boolean apagarAtividade(Atividade a)
    {
        return aplP.apagarAtividade(a);
    }
    
    public boolean apagarAtividadeCascata(Atividade a)
    {
        return aplP.apagarAtividadeCascata(a);
    }

    public Atividade alterarAtividade(Atividade atividade, List<Colaborador> colaboradores)
    {
        Atividade a = null;

        a = aplP.alterarAtividade(atividade, colaboradores);
        
        pagArvore.refreshArvore();

        return a;
    }

    public Atividade alterarAtividade(Atividade atividade)
    {
        Atividade a = null;

        a = aplP.alterarAtividade(atividade);

        pagArvore.refreshArvore();

        return a;
    }

    public List<Atividade> obterAtividades()
    {
        return aplP.obterAtividades();
    }

    public List<Atividade> obterAtividades(Projeto p)
    {
        return aplP.obterAtividades(p);
    }
    
    public List<Atividade> obterAtividades(Projeto p, NivelAtividade n, Colaborador c)
    {
        switch(n)
        {
            case GERAL: 
                return aplP.obterAtividadesGeral(p);
            case GRUPO: 
                //return aplP.obterAtividadesGrupo(p, c);
            case INDIVIDUAL: 
                return aplP.obterAtividadesIndividual(p, c);
            default: 
                return null;
        }
    }

    public List<Atividade> obterFilhas(Atividade a)
    {
        return aplP.obterFilhas(a);
    }
    
    public List<Atividade> obterFilhasGeral(Atividade a)
    {
        return aplP.obterFilhasGeral(a);
    }
    
    public List<Atividade> obterFilhas(Atividade a, NivelAtividade n, Colaborador c)
    {
        switch(n)
        {
            case GERAL: 
                return aplP.obterFilhasGeral(a);
            case GRUPO: 
                return aplP.obterFilhasGrupo(a, c);
            case INDIVIDUAL: 
                return aplP.obterFilhasIndividual(a, c);
            default: 
                return null;
        }
    }
    
    public Atividade obterPaiGeral(Atividade a)
    {
        return aplP.obterPaiGeral(a);
    }

    public void trocaPai(Atividade atividade, Atividade novoPai)
    {
        aplP.trocaPai(atividade, novoPai);
    }
    
    public void alterarPais(Atividade a, double diferenca)
    {
        aplP.alterarPais(a, diferenca);
    }
   
    //INTERFACE_ATIVIDADE
    public void setArvore(ArvoreAtividades pag)
    {
        this.pagArvore = pag;
    }

    public void setWinExecucao(PagExecucao pag)
    {
        this.pagExecucao = pag;
    }

    public Component criarArvoreProjeto()
    {
        arvore = (Window) Executions.createComponents("/ArvoreAtividades.zul", null, null);
        return arvore;
    }
    
    public Component criarArvoreProjeto(NivelAtividade nivel)
    {
        Map map = new HashMap();
        map.put("nivel", nivel);
        arvore = (Window) Executions.createComponents("/ArvoreAtividades.zul", null, map);
        return arvore;
    }

    public Component criarWinExecucao()
    {
        winExecucao = (Window) Executions.createComponents("/PagExecucao.zul", null, null);
        return winExecucao;
    }

    public void setPagFormAtividade(PagFormAtividade pag)
    {
        this.pagFormAtividade = pag;
    }

    public Component abrirPagFormAtividade(NivelAtividade n)
    {
        return Executions.createComponents("/pagFormAtividade.zul", null, null);
    }

    public void abrirIncluirAtividade()
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR);
        Executions.createComponents("/pagFormAtividade.zul", null, map);
    }

    public void abrirIncluirAtividade(Atividade atividadePai)
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR_FILHA);
        map.put("obj", atividadePai);
        Executions.createComponents("/pagFormAtividade.zul", null, map);
    }

    public void abrirEditarAtividade(Atividade atividade)
    {
        Map map = new HashMap();
        map.put("tipo", EDITAR);
        map.put("obj", atividade);
        Executions.createComponents("/pagFormAtividade.zul", null, map);
    }
    
    public void abrirConsultarAtividade(Atividade atividade)
    {
        Map map = new HashMap();
        map.put("tipo", CONSULTAR);
        map.put("obj", atividade);
        Executions.createComponents("/pagFormAtividade.zul", null, map);
    }

    //COLABORADOR_ATIVIDADE
    public List<Colaborador> obterColaboradoresAlocados(Atividade a)
    {
        return aplP.obterColaboradoresAlocados(a);
    }
    
    public List<Colaborador> obterColaboradoresGrupo(Atividade a)
    {
        return aplP.obterColaboradoresGrupo(a);
    }
    
    public List<ColaboradorAtividade> salvarAlocados(List<Colaborador> colaboradores, Atividade a)
    {
        return aplP.salvarAlocados(colaboradores, a);
    }
    
    public boolean ehAlocado(Atividade a, Colaborador c)
    {
        return aplP.ehAlocado(a, c);
    }

    //INTERFACE_COLABORADOR_ATIVIDADE
    public Component abrirAlocarColaboradores(Atividade a)
    {
        Map map = new HashMap();
        map.put("atividade", a);
        return Executions.createComponents("/pagAlocarColaboradores.zul", null, map);
    }
    
    public void atualizarPopupAlocados(List<Colaborador> alocados)
    {
        this.pagFormAtividade.preencherPopup(alocados);
    }
    
     //REGISTRO
    public RegistroAtividade salvarRegistro(Map argsRegistro)
    {
        RegistroAtividade r = null;

        r = aplP.salvarRegistro(argsRegistro);
        
        if (tabelaRegistro != null)
        {
            tabelaRegistro.addRegistro(r);
            
            Double horas = this.calcularHorasTrabalhadas(r.getColaborador().getAtividade().getProjeto(), r.getColaborador().getColaborador());
            
            this.atualizarPagExecucao(horas);
        }

        return r;
    }
    
    public RegistroAtividade alterarRegistro(RegistroAtividade r)
    {
        RegistroAtividade reg = null;

        reg = aplP.alterarRegistro(r);
        
        if (tabelaRegistro != null){
            
            tabelaRegistro.refreshRegistros(reg);
            
            Double horas = this.calcularHorasTrabalhadas(reg.getColaborador().getAtividade().getProjeto(), reg.getColaborador().getColaborador());
            
            this.atualizarPagExecucao(horas);
        }

        return r;
    }
    
    public List<RegistroAtividade> obterRegsitros(Projeto p, Colaborador c)
    {
        return aplP.obterRegistros(p, c);
    }
    
    public Map obterRegistros(Map atributos)
    {
        return aplP.obterRegistros(atributos);
    }
    
    public Double obterHorasProjeto(Projeto p)
    {
        return aplP.obterHorasProjeto(p);
    }
    
    public Double calcularHorasTrabalhadas(Projeto p, Colaborador c)
    {
        return aplP.calcularHorasTrabalhadas(p, c);
    }
    
    //INTERFACE_REGISTRO
    public void setPagRegistro(PagRegistro pag)
    {
        this.pagRegistro = pag;
    }
    
    public void setTabelaRegistro(TabelaRegistro tab)
    {
        this.tabelaRegistro = tab;
    }
    
    public void preencherTabelaRegistro(List<RegistroAtividade> registros)
    {
        if (tabelaRegistro != null) tabelaRegistro.preencheTabelaRegistros(registros);
    }
    
    public void atualizarTabelaRegistro(List<RegistroAtividade> registros)
    {
        if (tabelaRegistro != null) tabelaRegistro.atualizarTabelaRegistros(registros);
    }
    
    public void atualizarPagExecucao(Double horas)
    {
        if (pagExecucao != null) pagExecucao.atualizarHoras(horas);
    }
    
    public void abrirIncluirRegistro(Atividade atividade)
    {
        Map map = new HashMap();
        map.put("tipo", SALVAR);
        map.put("atividade", atividade);
        Executions.createComponents("/pagRegistro.zul", null, map);
    }

    public void abrirEditarRegistro(RegistroAtividade registro)
    {
        Map map = new HashMap();
        map.put("tipo", EDITAR);
        map.put("obj", registro);
        Executions.createComponents("/pagRegistro.zul", null, map);
    }
    
    public Listbox criarTabelaRegistro(List<RegistroAtividade> registros)
    {
        Map map = new HashMap();
        map.put("registros", registros);
        Listbox tabela = (Listbox) Executions.createComponents("/TabelaRegistro.zul", null, map);
        return tabela;
    }
    
    //RELATORIOS
    
    public void relatorioRegistros(Map atributos)
    {
        //aplR.relatorioRegistros(atributos);
    }
    
    //INTERFACE_RELATORIOS
    
    public void abrirRelatorioAtividades()
    {
        pagPrincipal.setWinRelatorioAtividades();
    }
    
    public Window criarWinRelatorioAtividades()
    {
        return (Window) Executions.createComponents("/pagRelatorioAtividades.zul", null, null);
    }
}
